home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / dev / gui / MultiDesktop.lha / MultiDesktop / ptr.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-03-27  |  4.8 KB  |  225 lines

  1. #include <exec/types.h>
  2. #include <exec/memory.h>
  3. #include <libraries/dos.h>
  4.  
  5. struct FileHandle *out,*fh,*tmp;
  6. ULONG              outputLen=0;
  7. BOOL               HasBMHD=FALSE;
  8.                    HasBODY=FALSE;
  9.                    HasGRAB=FALSE;
  10.                    HasPNTR=FALSE;
  11.                    HasCMAP=FALSE;
  12. ULONG              formLengthPos=0,pointerCountPos=0;
  13. UWORD              pointerCount=0;
  14.  
  15. struct BMHD
  16. {
  17.  UWORD Width,Height,X,Y;
  18.  UBYTE Depth;
  19.  UBYTE pad01;
  20.  UBYTE Compression;
  21.  UBYTE pad02;
  22.  UWORD pad03;
  23.  UBYTE xAspect,yAspect;
  24.  UWORD PageWidth,PageHeight;
  25. };
  26.  
  27. struct GRAB
  28. {
  29.  WORD OffsetX,OffsetY;
  30. };
  31.  
  32. struct PNTR
  33. {
  34.  UWORD PointerCount;
  35.  UWORD pad01;
  36. };
  37.  
  38. struct BMHD bmhd;
  39. struct GRAB grab={0,0};
  40. struct PNTR pntr={0,0};
  41. UBYTE       cmap[20];
  42.  
  43.  
  44. UBYTE tmpName[20];
  45. struct FileHandle *OpenTmp()
  46. {
  47.  struct FileHandle *fh;
  48.  int                i;
  49.  
  50.  for(i=0;i<200;i++)
  51.   {
  52.    sprintf(&tmpName,"RAM:temp.%d",i);
  53.    fh=Open(&tmpName,MODE_READWRITE);
  54.    if(fh) return(fh);
  55.   }
  56.  return(NULL);
  57. }
  58.  
  59. void Out(data,len)
  60.  UBYTE *data;
  61.  ULONG  len;
  62. {
  63.  Write(out,data,len);
  64.  outputLen+=len;
  65. }
  66.  
  67. void main(argc,argv)
  68.  long   argc;
  69.  UBYTE *argv[];
  70. {
  71.  UBYTE id[4];
  72.  ULONG size;
  73.  int   count;
  74.  long  i,j,k;
  75.  
  76.  if(argc<3) {
  77.   printf("USAGE: %s [Target] [Source1] {Source2} {..}\n",argv[0]);
  78.   exit(0); }
  79.  
  80.  out=Open(argv[1],MODE_NEWFILE);
  81.  if(out==NULL) {
  82.    puts("Unable to open output file.");
  83.    exit(0); }
  84.  
  85.  tmp=OpenTmp();
  86.  if(tmp==NULL) {
  87.    puts("Unable to open temporary file RAM:temp.0.");
  88.    exit(0); }
  89.  
  90.  /* ---- FORM ---------------------- */
  91.  Out("FORMxxxxILBM",12);
  92.  formLengthPos=4;
  93.  
  94.  /* ---- PNTR ---------------------- */
  95.  Out("PNTR",4);
  96.  j=sizeof(struct PNTR); Out(&j,4);
  97.  pointerCountPos=outputLen;
  98.  Out(&pntr,sizeof(struct PNTR));
  99.  
  100.  /* ---- CMAP, BODY ---------------- */
  101.  for(k=2;k<argc;k++)
  102.   {
  103.    fh=Open(argv[k],MODE_OLDFILE);
  104.    if(fh!=NULL)
  105.     {
  106.      printf("load: %s.\n",argv[k]);
  107.      HasPNTR=HasBODY=FALSE;
  108.      count=0;
  109.      Read(fh,&id,4L);
  110.      if(!(strncmp(&id,"FORM",4))) {
  111.        Read(fh,&size,4);
  112.        Read(fh,&id,4L);
  113.        if(!(strncmp(&id,"ILBM",4))) {
  114.          Read(fh,&id,4L);
  115.          j=Read(fh,&size,4L);
  116.          while((j==4)||(HasBODY==FALSE)) {
  117.  
  118.            if(!(strncmp(&id,"BMHD",4))) {
  119.              if(HasBMHD==FALSE) {
  120.                Read(fh,&bmhd,sizeof(struct BMHD));
  121.  
  122.                Out("BMHD",4);
  123.                j=sizeof(struct BMHD); Out(&j,4);
  124.                Out(&bmhd,sizeof(struct BMHD));
  125.                Seek(fh,-sizeof(struct BMHD),OFFSET_CURRENT);
  126.  
  127.                printf("save: BMHD chunk; width=%ld, height=%ld.\n",bmhd.Width,bmhd.Height);
  128.                HasBMHD=TRUE;
  129.               }
  130.             }
  131.  
  132.            else if(!(strncmp(&id,"CMAP",4))) {
  133.              if(HasCMAP==FALSE) {
  134.                Read(fh,&cmap,12);
  135.  
  136.                Out("CMAP",4);
  137.                j=12; Out(&j,4);
  138.                Out(&cmap,12);
  139.                Seek(fh,-12,OFFSET_CURRENT);
  140.  
  141.                puts("save: CMAP chunk.");
  142.                HasCMAP=TRUE;
  143.               }
  144.             }
  145.  
  146.            else if(!(strncmp(&id,"GRAB",4))) {
  147.              if(HasGRAB==FALSE) {
  148.                Read(fh,&grab,sizeof(struct GRAB));
  149.  
  150.                Out("GRAB",4);
  151.                j=sizeof(struct GRAB); Out(&j,4);
  152.                Out(&grab,sizeof(struct GRAB));
  153.                Seek(fh,-sizeof(struct GRAB),OFFSET_CURRENT);
  154.  
  155.                printf("save: GRAB chunk; x=%ld, y=%ld.\n",grab.OffsetX,grab.OffsetY);
  156.                HasGRAB=TRUE;
  157.               }
  158.             }
  159.  
  160.            else if(!(strncmp(&id,"PNTR",4))) {
  161.              if(HasPNTR==FALSE) {
  162.                Read(fh,&pntr,sizeof(struct PNTR));
  163.                Seek(fh,-sizeof(struct PNTR),OFFSET_CURRENT);
  164.                count=pntr.PointerCount;
  165.                HasPNTR=TRUE;
  166.               }
  167.             }
  168.  
  169.            else if(!(strncmp(&id,"BODY",4))) {
  170.              for(i=0;i<size;i++)
  171.               {
  172.                Read(fh,&id,1);
  173.                Write(tmp,&id,1);
  174.               }
  175.  
  176.              for(i=0;i<4;i++) id[i]=0x00;
  177.              Write(tmp,&id,4L);
  178.              Write(tmp,&id,4L);
  179.  
  180.              if(HasPNTR==FALSE) count=1;
  181.              printf("save: %ld pointer images, %ld bytes.\n",count,size);
  182.              HasBODY=TRUE;
  183.             }
  184.  
  185.            if(size & 1) size++;
  186.            Seek(fh,size,OFFSET_CURRENT);
  187.            Read(fh,&id,4L);
  188.            j=Read(fh,&size,4L);
  189.           }
  190.         }
  191.       }
  192.  
  193.      Close(fh);
  194.      pointerCount+=count;
  195.     }
  196.    else
  197.      printf("Unable to open file: %s.\n",argv[k]);
  198.   } 
  199.  
  200.  printf("save: BODY chunk; %ld pointer images total.\n",pointerCount);
  201.  Out("BODY",4);
  202.  j=Seek(tmp,0,OFFSET_BEGINNING);
  203.  Out(&j,4);
  204.  
  205.  for(i=0;i<j;i++)
  206.   {
  207.    Read(tmp,&id,1);
  208.    Out(&id,1);
  209.   }
  210.  
  211.  puts("save: IFF data.");
  212.  Seek(out,formLengthPos,OFFSET_BEGINNING);
  213.  outputLen-=4;
  214.  Write(out,&outputLen,4);
  215.  
  216.  Seek(out,pointerCountPos,OFFSET_BEGINNING);
  217.  Write(out,&pointerCount,2);
  218.  
  219.  Close(tmp);
  220.  DeleteFile(&tmpName);
  221.  Close(out);
  222.  puts("done.");
  223. }
  224.  
  225.